package com.software.comment.contorller;

import com.google.gson.Gson;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.software.comment.config.QiniuConfig;
import com.software.comment.pojo.Result;
import jakarta.annotation.Resource;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author 周昊
 * @since 2024/12/15 11.34
 * @version 1.0
 */
@RestController
@RequestMapping("/commentPicture")

@Validated
public class CommentFileUploadController {

    @Resource
    private QiniuConfig qiniuConfig;

    /**
     * 上传文件
     * @param file 上传的文件
     * @return 上传结果
     */
    @PostMapping()
    @CrossOrigin(origins = "http://localhost:5173")
    public Result<?> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            // 配置七牛云上传相关参数，使用华南区域（对应存储桶所在区域）
            Configuration cfg = new Configuration(Region.huanan());
            cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;
            UploadManager uploadManager = new UploadManager(cfg);

            // 获取七牛云认证信息及生成上传凭证
            Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
            String upToken = auth.uploadToken(qiniuConfig.getBucket());

            // 将MultipartFile转换为本地临时文件，以便后续上传操作（七牛云SDK上传方法通常接收本地文件路径）
            File tempFile = convertMultipartFileToFile(file);
            String localFilePath = tempFile.getAbsolutePath();
            String key = UUID.randomUUID().toString();

            // 执行文件上传操作
            Response response = uploadManager.put(localFilePath, key, upToken);
            // 解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            // 删除临时文件（上传完成后，临时文件已不需要，释放空间）
            if (!tempFile.delete()) {
                System.err.println("临时文件删除失败");
            }

            // 构建文件完整URL
            String fileUrl = "https://snuhrh5e4.hn-bkt.clouddn.com/" + putRet.key;
            // 这里可以添加将fileUrl保存到数据库的代码，后续步骤详细说明

            return Result.success(fileUrl) ;
        } catch (IOException e) {
            e.printStackTrace();
            return Result.success("文件上传失败: ");
        }
    }

    /**
     * 将MultipartFile转换为本地临时文件
     * @param multipartFile 上传的文件
     * @return 本地临时文件
     * @throws IOException 异常
     */
    private File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
        File tempFile = File.createTempFile("temp", null);
        try (FileOutputStream fos = new FileOutputStream(tempFile)) {
            fos.write(multipartFile.getBytes());
        }
        return tempFile;
    }
}